package com.qf.day02;

import java.util.Random;
import java.util.concurrent.CountDownLatch;

/**
 *
 * 例如：在手机上安装一个应用程序，假如需要5个子进程检查服务授权，
 * 那么主进程会维护一个计数器，初始计数就是5。
 * 用户每同意一个授权该计数器减1，当计数减为0时，主进程才启动，否则就只有阻塞等待了。
 *
 * CountDownLatch中count down是倒数的意思，
 * latch则是门闩的含义。
 *
 * 整体含义可以理解为倒数的门栓，似乎有一点“三二一，芝麻开门”的感觉。CountDownLatch的作用也是如此。
 *
 *   案例：6个同学陆续离开教室后值班同学才可以关门。
 *       6个同学代表： 6个子线程
 *       值班同学代表： 主线程
 *
 *
 *    练习：秦灭六国，一统华夏。（模仿课堂案例，练习枚举类的使用）
 *
 *    案例：组队打boss过关卡游戏。
 *       8个人一起打游戏
 *       游戏共分三关
 *       进入下一关之前8人必须聚齐  才可以开启下一关 依次类推  共同通关
 *       CyclicBarrier 循环栅栏
 *
 *
 *    案例：6辆车抢占3个车位
 *       Semaphore 信号量
 * @author lixu
 */
public class CountDownLatchDemo {


    public static void main(String[] args) throws Exception{//主线程  值班同学
        CountDownLatch countDownLatch = new CountDownLatch(6);

        for (int i = 1; i <= 6 ; i++) {
            new Thread(() -> {
                try {
                    Thread.sleep(new Random().nextInt(1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "号同学离开了教室!");
                //每走一名同学减一
                countDownLatch.countDown();//-1
            },String.valueOf(i)).start();
        }

        //阻塞
        countDownLatch.await();
        System.out.println("值班同学可以关门了");
    }









}
